package comandos;

import java.util.ArrayList;

import model.Usuario;
import protocol.MensajeComando;
import client.ClienteSession;

public class ObtenerAmigosConectados implements ComandoCliente {
	private MensajeComando estadoOperacion;
	private Usuario usuario;
	private static ArrayList<Usuario> amigosConectados;
	private final Object lock = new Object();

	@SuppressWarnings("unchecked")
	public void ejecutar(ClienteSession cliente, boolean invocadoPorServidor) {
		// Si fue invocado por el servidor (estoy recibiendo la lista de usuarios)
		if (invocadoPorServidor) {
			try {
				synchronized (lock) {
					ObtenerAmigosConectados.amigosConectados = (ArrayList<Usuario>) cliente.getInput().readObject();
					lock.notify();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

		} else // Sino fue invocado por el servidor, estoy pidiendo la lista de
				// amigos conectados
		{
			try {
				// Envio un mensaje de peticion de la lista de amigos conectados
				cliente.getOutput().writeObject(new MensajeComando("obtener_amigos_conectados", 0));
				cliente.getOutput().flush();

				// Envio el usuario del cual quiero obtener la lista de amigos
				cliente.getOutput().writeObject(this.usuario);
				cliente.getOutput().flush();
				
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}

		}

	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public MensajeComando getEstadoOperacion() {
		return estadoOperacion;
	}

	public ArrayList<Usuario> getAmigosConectados() throws InterruptedException {
		synchronized (lock) {
			lock.wait();
			return ObtenerAmigosConectados.amigosConectados;
		}
	}

	public void setEstadoOperacion(MensajeComando estadoOperacion) {
		this.estadoOperacion = estadoOperacion;
	}

}
